{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 简述仿射变换和透视变换的基本概念，并用实例说明。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**仿射变换**是一种二维坐标到二维坐标之间的线性变换，它保持了二维图形的“平直性”（直线经过变换之后依然是直线）和“平行性”（二维图形之间的相对位置关系保持不变，平行线依然是平行线，且直线上点的位置顺序不变）。任意的仿射变换都能表示为乘以一个矩阵(线性变换)，再加上一个向量 (平移) 的形式。平移、比例缩放和旋转变换都是一种称为仿射变换的特殊情况。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "把物体的三维图像表示转变为二维表示的过程，称为**透视变换**。透视变换也是一种平面映射，并且可以保证任意方向上的直线经过透视变换后仍然保持是直线。透视变换具有9个自由度（其变换系数为9个），故可以实现平面四边形到四边形的映射。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 结合图简述图像坐标系、相机坐标系和世界坐标系的定义，并说明三者之间的变换关系。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 图像坐标系\n",
    "    - 用物理单位表示像素的位置，坐标原点为摄像机光轴与图像物理坐标系的交点位置。\n",
    "- 相机坐标系\n",
    "    - 以摄像机光心为原点（在针孔模型中也就是针孔为光心），z轴与光轴重合也就是z轴指向相机的前方（也就是与成像平面垂直），x轴与y轴的正方       向与物体坐标系平行，其中上图中的f为摄像机的焦距。单位m\n",
    "- 世界坐标系\n",
    "    - 根据情况而定，可以表示任何物体，此时是由于相机而引入的。单位m。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 世界坐标到相机坐标系的变换\n",
    "<img style=\"float: center;\" src=\"./images/世界坐标系-相机坐标系1.png\" width=\"80%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "物体之间的坐标系变换都可以表示坐标系的旋转变换加上平移变换，则世界坐标系到相机坐标系的转换关系也是如此。绕着不同的轴旋转不同的角度得到不同的旋转矩阵。如下：\n",
    "<img style=\"float: center;\" src=\"./images/世界坐标系-相机坐标系2.png\" width=\"80%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "那么世界坐标系到相机坐标系的变换如下：\n",
    "<img style=\"float: center;\" src=\"./images/世界坐标系-相机坐标系3.png\" width=\"60%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 相机坐标系到图像坐标系的变换\n",
    "从相机坐标系到图像坐标系，属于透视投影关系，从3D转换到2D。 也可以看成是针孔模型的改变模型。满足三角形的相似定理。\n",
    "<img style=\"float: center;\" src=\"./images/相机-图像.png\" width=\"60%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 什么是相机的内、外参数矩阵？实际中你能结合身边的实例(如电脑摄像头、手机镜头)说明这些参数的大致值么？ "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* `相机内参数`：与相机自身特性相关的参数，比如相机的焦距、像素大小等；\n",
    "* `相机外参数`：在世界坐标系中的参数，比如相机的位置、旋转方向等。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* `相机内参数矩阵`:\n",
    "$$\n",
    "\\left[\n",
    " \\begin{matrix}\n",
    "   f_x & 0 & u_0 & 0 \\\\\n",
    "   0 & f_y & v_0 & 0 \\\\\n",
    "   0 & 0 & 1 & 0 \\\\\n",
    "  \\end{matrix} \n",
    "\\right]\n",
    "$$\n",
    "\n",
    "其中$f_x ＝ f/dX ,f_y = f/dY$ ,分别称为x轴和y轴上的归一化焦距；f是相机的焦距，dX和dY分别表示传感器x轴和y轴上单位像素的尺寸大小。\n",
    "$u_0和v_0$则表示的是光学中心，即摄像机光轴与图像平面的交点，通常位于图像中心处，故其值常取分辨率的一半。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* `相机外参数矩阵`：\n",
    "$$\n",
    "\\left[\n",
    " \\begin{matrix}\n",
    "   \\mathbf R & \\mathbf t \\\\\n",
    "   \\mathbf 0^T_3 & 1 \\\\\n",
    " \\end{matrix}\n",
    "\\right]\n",
    "$$\n",
    "\n",
    "其中$\\mathbf R$为旋转矩阵， $\\mathbf t$为平移向量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现以Canon 70d相机为例进行求解其内参数矩阵：<br>\n",
    "焦距 f = 50mm   分辨率：1920×1080    传感器尺寸：22.5×15 mm <br>\n",
    "根据以上定义可以有：<br>\n",
    "$u_0 = 1920/2$  &emsp;  $v_0 = 1080/2$  &emsp;  $dx = 22.5/1920$  &emsp;  $dy = 15/1080$<br> \n",
    "$f_x = f/dx$  &emsp;  $f_y = f/dy$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 说明使用线性法求解相对位姿时的要求输入和输出，以及求解的基本思想。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**线性法求解相对位姿**\n",
    "\n",
    "* 建立线性求解基本方程：\n",
    "<img style=\"float: center;\" src=\"./images/线性求解基本方程1.png\" width=\"60%\">\n",
    "<img style=\"float: center;\" src=\"./images/线性求解基本方程2.png\" width=\"60%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 未知数线性求解\n",
    "<img style=\"float: center;\" src=\"./images/线性求解未知数1.png\" width=\"60%\">\n",
    "<img style=\"float: center;\" src=\"./images/线性求解未知数2.png\" width=\"60%\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于每一个点都可以形成如上两个方程，对于多个点，可进行堆叠，并记成矩阵形式：<br>\n",
    "\n",
    "$$\n",
    "\\left[\n",
    " \\begin{matrix}\n",
    "   \\mathbf A_1 \\\\\n",
    "   \\vdots \\\\\n",
    "   \\mathbf A_N\\\\\n",
    "  \\end{matrix} \n",
    "\\right]\\boldsymbol \\theta = \\left[\\begin{matrix}\\mathbf b_1 \\\\ \\vdots \\\\ \\mathbf b_N \\\\ \\end{matrix}\\right]\n",
    "$$\n",
    "\n",
    "$$\\mathbf A\\boldsymbol \\theta = \\mathbf b$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**要求输入：**有六个或以上特征点且非共面时，可求解：$\\boldsymbol \\theta = (\\mathbf A^T\\mathbf A)^{-1}\\mathbf A^T\\mathbf b'$<br>\n",
    "得到输出的旋转和平移的11个参数，最后一个参数t3可利用$r_{11}^2+r_{21}^2+r_{31}^2=1$约束求出，最后利用矩阵的QR分解，得到最终的旋转矩阵。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 说明使用Zhang方法进行相机标定需要的输入条件和得到的具体输出量，以及Zhang方法的主要步骤 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**相机标定的输入**：标定图像上所有内角点的图像坐标，标定板图像上所有内角点的空间三维坐标（一般情况下假定图像位于Z=0平面上）。并且要求平面靶标有四个点或更多时，可求解单应矩阵。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**相机标定的输出量**：相机的内外参数和非线性畸变参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**标定步骤**\n",
    "* 对一个pose，计算单应矩阵\n",
    "* 有三个以上Pose，根据各单应矩阵计算线性相机参数\n",
    "* 使用非线性优化方法计算非线性参数"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
